#include <string.h>
#include <iostream>
//关于头文件的引入顺序，有一个要求：
//1.自己自定义的头文件
//2.c语言的头文件
//3.c++标准类库的头文件
//4.c++第三方类库的头文件
using std::cout;
using std::endl;

void test(){
    //申请一个int 4字节的空间大小
    //1.申请堆空间，申请出来的是未初始化的空间
    int * pInt = (int *)malloc(sizeof(int));
    //2.进行初始化操作
    memset(pInt, 0, sizeof(int));
    //3.进行赋值操作
    *pInt = 30;
    cout << *pInt << endl;
    // .......
    //4.回收空间
    free(pInt);
    cout << pInt << endl;
    cout << *pInt << endl;
    pInt = nullptr;
    cout << pInt << endl;
    cout << *pInt << endl;
}

//需要成对去使用
//malloc------free
//new--------delete
//new []-----delete []
void test2(){
    //C++给我们提供的操作堆空间的方式
    //使用了一个new关键字
    //new相较于malloc：不需要指定申请空间大小、返回值
    int * pInt = new int();
    //new申请过的空间不需要进行初始化操作
    *pInt = 30;
    cout << *pInt << endl;
    delete pInt;
}
//申请数组空间 int[5]  4 *5
void test3(){
    //使用malloc和free如何操作
    int * arr = (int *)malloc(sizeof(int) * 5);
    //进行初始化操作
    memset(arr, 0, sizeof(int) * 5);
    //进行赋值操作
    for(int i = 0; i < 5; ++i){
        arr[i] = i;
        cout << arr[i] << endl;
    }
    free(arr);

}
//使用new和delete操作数组
void test4(){
    int * arr =  new int[5]();
    for(int i = 0; i < 5; ++i){
        arr[i] = i;
        cout << arr[i] << endl;
    }
    //如果操作的是数组，那么需要添加一个[]
    delete [] arr;

}

void test5(){
    //char *指针相较于其他类型的指针有很多不同
    int a = 10;
    int * p = &a;
    const char * message = "hello,world";
    cout << p << endl;
    cout << *p << endl;
    //使用char *指针进行cout打印输出时
    //显示的是指针所指向的值，并不是显示地址
    cout << message << endl;
}

int main()
{
    test();
    return 0;
}

